/**
 * 实现HTML字符的转义
 * @param {*} str 待转义的字符串
 * @returns
 */
export function encodeHTML(str) {
  // 判断传入的参数是否为字符串类型
  if (typeof str !== "string") {
    // 如果不是字符串类型，则返回空字符串
    return "";
  }
  // 使用正则表达式将字符串中的<、&、>替换为对应的HTML实体
  return str.replace(/<|&|>/g, function (matches) {
    // 返回对应的HTML实体
    return {
      "<": "&lt;",
      "&": "&amp;",
      ">": "&gt;",
    }[matches];
  });
}

/**
 * 通过DOM API 转义HTML字符;
 * 只能在浏览器上下文环境中使用。
 * 例如，如果是Service Workers环境，或者是Node.js环境中，这个方法就不行了，只能使用传统的字符串处理方法了。
 * @param {*} str 待转义的HTML字符
 * @returns
 * @see https://www.zhangxinxu.com/wordpress/2021/01/dom-api-html-encode-decode/
 * @example
 * encodeHTMLDom("<div>hello world</div>") // &lt;div&gt;hello world&lt;/div&gt;
 */
export function encodeHTMLDom(str) {
  if (typeof str !== "string") {
    return "";
  }
  const textNode = document.createTextNode(str);
  const div = document.createElement("div");
  div.appendChild(textNode);
  return div.innerHTML;
}

/**
 * HTML字符的反转义
 * @param {*} str 待转义的HTML字符
 * @returns
 * @example
 * decodeHTMLDom("&lt;div&gt;hello world&lt;/div&gt;") // <div>hello world</div>
 */
export function decodeHTMLDom(str) {
  if (typeof str !== "string") {
    return "";
  }
  const doc = new DOMParser().parseFromString(str, "text/html");
  return doc.documentElement.textContent;
}

export function decodeHTMLDom(str) {
  if (typeof str !== "string") {
    return "";
  }
  const textarea = document.createElement("textarea");
  textarea.innerHTML = str;
  return textarea.childNodes[0].nodeValue;
}

/**
 * 用于解码HTML字符串
 * @param {*} str
 * @returns
 */
export function decodeHTML(str) {
  // 如果传入的参数不是字符串，则返回空字符串
  if (typeof str !== "string") {
    return "";
  }
  // 使用正则表达式匹配字符串中的HTML标签，并替换为对应的字符
  return str.replace(/&lt;|&amp;|&gt;/g, function (matches) {
    return {
      "&lt;": "<",
      "&amp;": "&",
      "&gt;": ">",
    }[matches];
  });
}
